package com.jd.finance.core.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jd.finance.core.mapper.OpreateLogMapper;
import com.jd.finance.core.mapper.UserMapper;
import com.jd.finance.core.pojo.dto.GetOpreateLogDTO;
import com.jd.finance.core.pojo.entity.OpreateLog;
import com.jd.finance.core.pojo.entity.User;
import com.jd.finance.core.service.OpreateLogService;
import com.jd.finance.result.BaseResult;
import com.jd.finance.util.DateUtil;
import com.jd.finance.util.RegexValidateUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;

/**
 * <p>
 * 操作日志表 服务实现类
 * </p>
 *
 * @author LiQingBo
 * @since 2022-05-25
 */
@Component
public class OpreateLogServiceImpl extends ServiceImpl<OpreateLogMapper, OpreateLog> implements OpreateLogService {
    @Autowired
    private OpreateLogMapper opreateLogMapper;
    @Autowired
    private UserMapper userMapper;

    @Resource
    private AdminUtilsServiceImpl adminUtilsService;

    /**
     *  添加操作日志
     * @param uid
     * @param operate   操作
     * @param ip        IP
     * @return
     */
    @Override
    public boolean add(Integer uid, String operInfo, String operate, String ip) {
        if (uid == null){
            log.error("传参为空");
            return false;
        }

        if (StringUtils.isAllBlank(operate, ip)){
            log.error("传参为空");
            return false;
        }
        User user = userMapper.selectById(uid);
        OpreateLog opreateLog = new OpreateLog();
        opreateLog.setOperPhone(user.getUserPhone());
        opreateLog.setOperListName(operInfo);
        opreateLog.setOperInfo(operate);
        opreateLog.setOperFinishTime(LocalDateTime.now());
        opreateLog.setIp(ip);

        int insert =  opreateLogMapper.insert(opreateLog);
        return insert >=1;
    }

    /**
     * 查询所有操作日志
     * @param uid 总经理id或管理员id
     * @return
     */
    @Override
    public BaseResult getAllOperateLog(Integer uid) {
        if (uid==null) {
            log.error("查询所有操作日志，查询所有部门信息信息为空!");
            return BaseResult.error().message("查询所有操作日志，查询所有部门信息信息为空!");
        }

        if (!adminUtilsService.isInformation(uid) && !adminUtilsService.isGM(uid)) {
            log.error("该用户非总经理或信息管理员身份!");
            return BaseResult.error().message("该用户非总经理或信息管理员身份!");
        }
        List<GetOpreateLogDTO> list=opreateLogMapper.getAllOperateLog();

        if (list==null || list.size()==0) {
            log.error("未查询到相关数据!");
            return BaseResult.error().message("未查询到相关数据!");
        }
        return BaseResult.ok().data("opreateLogList",list);
    }

    /**
     * 根据时间段查询操作日志
     * @param uid     总经理或管理员id
     * @param bigTime 开始时间
     * @param expTime 结束时间
     * @return
     */
    @Override
    public BaseResult selectLogByTime(Integer uid, String bigTime, String expTime) {
        if (uid==null || bigTime==null || expTime==null) {
            log.error("根据时间段查询操作日志,提交信息为空!");
            return BaseResult.error().message("根据时间段查询操作日志,提交信息为空!");
        }
        if (!adminUtilsService.isAdmin(uid) && !adminUtilsService.isGM(uid)) {
            log.error("该用户非管理员或总经理身份!");
            return BaseResult.error().message("该用户非管理员或总经理身份!");
        }

        if (!DateUtil.validateDate(bigTime) || !DateUtil.validateDate(expTime)) {
            log.error("输入的日期格式不正确!");
            return BaseResult.error().message("输入的日期格式不正确!");
        }

        List<GetOpreateLogDTO> list=opreateLogMapper.selectLogByTime(bigTime,expTime);
        if (list==null || list.size()==0) {
            log.error("未查询到相关数据!");
            return BaseResult.error().message("未查询到相关数据!");
        }
        return BaseResult.ok().data("selectLogByTime",list);
    }

    /**
     * 根据手机号
     * @param uid       总经理或管理员id
     * @param userPhone 手机号
     * @return
     */
    @Override
    public BaseResult selectLogByPhone(Integer uid, String userPhone) {
        if (uid==null || userPhone==null) {
            log.error("根据手机号查询操作日志,提交信息为空!");
            return BaseResult.error().message("根据手机号查询操作日志,提交信息为空!");
        }
        if (!adminUtilsService.isAdmin(uid) || !adminUtilsService.isGM(uid)) {
            log.error("该用户非管理员或总经理身份!");
            return BaseResult.error().message("该用户非管理员或总经理身份!");
        }

        if (!RegexValidateUtils.checkCellphone(userPhone)) {
            log.error("输入的手机号格式不正确!");
            return BaseResult.error().message("输入的手机号格式不正确!");
        }
        List<GetOpreateLogDTO> list=opreateLogMapper.selectLogByPhone(userPhone);
        if (list==null || list.size()==0) {
            log.error("未查询到相关数据!");
            return BaseResult.error().message("未查询到相关数据!");
        }

        return BaseResult.ok().data("selectLogByPhone",list);
    }
}
